#pragma once

#include "noncopyable.h"

class InetAddress;

// 封装socket文件描述符
class Socket : noncopyable
{
public:
    // 构造函数,使用已有的socket文件描述符初始化Socket对象
    explicit Socket(int sockfd)
        : sockfd_(sockfd)
    {}

    // 析构函数,负责关闭socket
    ~Socket();

    int fd() const { return sockfd_; } // 返回文件描述符
    void bindAddress(const InetAddress &localaddr); // 绑定socket到本地地址
    void listen(); // 将socket设置为监听模式
    int accept(InetAddress *peeraddr); // 接受连接并返回新的socket文件描述符

    void shutdownWrite(); // 关闭写操作

    void setTcpNoDelay(bool on);  // 设置TCP_NODELAY选项
    void setReuseAddr(bool on);  // 设置地址复用
    void setReusePort(bool on);  // 设置端口复用
    void setKeepAlive(bool on);  // 设置保活属性
private:
    const int sockfd_;  // socket文件描述符
};